#include "userManage.h"
#include "json.hpp"
#include <sys/socket.h>
using json = nlohmann::json;
void UserManage::read_cb(const char *buf)
{

    // 接收到的数据buf转成string
    string recv = string(buf);
    if (recv.empty())
    {
        std::cerr << "输入字符串为空，无法解析JSON" << std::endl;
        return; // 或者你可以抛出一个异常或执行其他错误处理逻辑
    }
    // 把string转成json对象
    json json_obj = json::parse(recv);

    // 把json对象转成类对象
    user = new User();

    // switch结构判断user要进行请求类型username = j.at("username").get<string>();

    switch (json_obj.at("cmd").get<int>())
    {
    case 0:
        // 调用注册函数
        user_register(user);
        break;
    case 1:
        // 调用登录函数
        user->from_json(json_obj);
        user_Login(user);
        // cout << user->getUsername() << endl;
        // cout << user->getPassword() << endl;
        break;

    case 3:
        user_quit(user);
        break;
        // 添加好友
    case 6:
        // 发送消息
        send_message(json_obj);
    default:
        break;
    }
    json_obj.clear();
}

int UserManage::user_Login(User *user)
{
    string username = user->getUsername();
    string password = user->getPassword();
    json recvJson;
    if (ChatDatabase::getInstanceChatDatabase()->my_database_user_exist(username, &(user->uid)))
    {

        // 用户存在，判断密码
        if (ChatDatabase::getInstanceChatDatabase()->my_database_user_confirm(username, password))
        {

            // 登录成功
            recvJson = user->toJSON();
            // 把登录成功的用户名和它的socketFd放进数据库的在线map里
            ChatDatabase::getInstanceChatDatabase()->my_database_add_online_user(username, socketFd);

            recvJson["cmd"] = LOGIN_SUCCESS;
            // 转成string
            string recv = recvJson.dump();
            // 向客户端发送json数据格式字符串
            ssize_t sendSize = send(socketFd, recv.c_str(), recv.size(), 0);
            cout << recv << endl;
            // cout << recvJson << endl;

            get_user_friends(user);
            return 1;
        }
        else
        {
            // 密码不对

            recvJson["cmd"] = LOGIN_PASSWORD_ERROR;
            // 转成string
            string recv = recvJson.dump();
            // 向客户端发送json数据格式字符串
            ssize_t sendSize = send(socketFd, recv.c_str(), recv.size(), 0);
            cout << "warning" << endl;
            return 0;
        }
    }
    else
    {
        // 用户不存在
        // json recvJson;
        recvJson["cmd"] = LOGIN_USER_NONEXISTENCE;
        // 转成string
        string recv = recvJson.dump();
        // 向客户端发送json数据格式字符串
        ssize_t sendSize = send(socketFd, recv.c_str(), recv.size(), 0);
        cout << "warning" << endl;
        return 0;
    }
}
bool UserManage::user_register(User *user)
{
    string username = user->getUsername();
    string password = user->getPassword();
    if (ChatDatabase::getInstanceChatDatabase()->my_database_user_register(username, password) == 0)
    {
        // cout << "66666666" << endl;
        json recvJson;
        recvJson["cmd"] = REGISTER_SUCCESS;
        // 转成string--
        string recv = recvJson.dump();
        // 向客户端发送json数据格式字符串
        ssize_t sendSize = send(socketFd, recv.c_str(), recv.size(), 0);
        return true;
    }
    else
    {
        // cout << "77777777" << endl;
        json recvJson;
        recvJson["cmd"] = REGISTER_USER_EXIST;
        // 转成string
        string recv = recvJson.dump();
        // 向客户端发送json数据格式字符串
        ssize_t sendSize = send(socketFd, recv.c_str(), recv.size(), 0);
        return false;
    }
}

bool UserManage::user_quit(User *user)
{
    // 处理退出
    // 关闭socket
    // close(socketFd);
    return true;
}

void UserManage::get_user_friends(User *user)

{ // 创建一个空的JSON数组来存储用户
    json users_json;
    json friends_array = nlohmann::json::array();
    // 获取好友数据
    string uid = user->getUid();
    vector<UserInformation> array;
    ChatDatabase::getInstanceChatDatabase()->my_database_get_friend_list(uid, array);
    // 遍历好友数据并添加到JSON数组中
    for (const auto &user : array)
    {

        friends_array.push_back(user.toJSON());
    }
    // 将好友列表数组和命令添加到JSON对象中
    users_json["cmd"] = FRIENDS_NUM;       // 假设FRIENDS_NUM是一个整数或字符串常量
    users_json["friends"] = friends_array; // 添加好友列表数组到对象中
    string recv = users_json.dump();
    // 向客户端发送json数据格式字符串
    ssize_t sendSize = send(socketFd, recv.c_str(), recv.size(), 0);
    cout << recv << endl;
}

void UserManage::send_message(json &jsonMsg)
{
    string receivername = jsonMsg.at("username").get<string>();
    string receiverUsername = ChatDatabase::getInstanceChatDatabase()->my_database_user_username(receivername);

    // 获取接收者的socketFd
    int receiverSocketFd = ChatDatabase::getInstanceChatDatabase()->my_database_get_online_user(receiverUsername);
    // 如果接收者在线，向其发送消息
    if (receiverSocketFd != -1)
    {
        // 直接从JSON中获取message字段，假设它已经是字符串
        string message = jsonMsg.at("message").get<string>();
        // 向客户端发送消息
        ssize_t sendSize = send(receiverSocketFd, message.c_str(), message.size(), 0);
        if (sendSize == -1)
        {
            // 发送失败，处理错误
            cerr << "Failed to send message to " << receiverUsername << endl;
        }
        else
        {
            // 发送成功，可以打印确认信息（如果需要）
            // std::cout << "Message sent to " << receiverUsername << std::endl;
        }
    }
    else
    {
        cout << "Receiver not online" << endl;
    }
}